#include <iostream>
using namespace std;
#include <set>

//multiset 集合(内部是树) 和set集合一样 
//multiset 集合内部的元素是可以重复的

void test1()
{
        multiset<int> mset;
        int tmp = 0;
        printf("请输入multiset集合的值: ");
        scanf("%d", &tmp);
        while (tmp != 0)
        {
                mset.insert(tmp);
                printf("请输入multiset集合的值:");
                scanf("%d", &tmp);
        }

        for (multiset<int>::iterator it = mset.begin(); it != mset.end(); it++)
        {
                cout<<*it<<" ";
        }
        cout<<endl;
        
        while (!mset.empty())
        {
                multiset<int>::iterator it = mset.begin();
                cout<<*it<<" ";
                mset.erase(it);
        }
        cout<<endl;
}

int main(int argc, char const *argv[])
{
        test1();
        return 0;
}

//stl总结1
/*
容器基本都是copy元素到容器

vector容器 内部数据结构是数组   单端数组
        在 尾部  弹入和弹出元素非常快,   在中间或头部弹入和弹出元素非常慢
        支持 [] at()操作

deque容器 内部数据结构是数组 双端数组
        在  尾部或头部 弹入和弹出元素非常快,   在中间弹入和弹出元素非常慢
        支持 [] at()操作

stack容器 栈 先进后出  靠数组实现
        内部是通过deque简单的装饰而成的 
        top()栈顶取元素

queue容器 队列  先进先出 靠数组实现
        内部是通过deque简单的装饰而成的
priority_queue
        最大值优先队列 最小值优先队列

list容器 内部数据结构是数组  双向链表 
        可高效地进行插入删除元素
        不可以随机的存取元素  所以不支持 at() [] it+5 
        it++是可以的

set容器 集合 内部数据结构是红黑树
        元素唯一 按顺序排列 默认从小到大 可以自己更改排列顺序 
        不支持 [] at()
        修改元素时必须先删除再插入新元素
        在插入和删除操作上比vector快
multiset
        元素可以重复
*/